//
//  MFView.m
//  CoreGraphicDemo
//
//  Created by 胡晓桥 on 15/1/30.
//  Copyright (c) 2015年 Qian100. All rights reserved.
//

#import "MFView.h"

@implementation MFView

/*
 绘图的步骤：
 1.获取绘图上下文
 2.创建并设置路径
 3.将路径添加到上下文
 4.设置上下文状态
 5.绘制路径
 6.释放路径
 */

#pragma mark - 绘图
//绘图只能在此方法中调用，否则无法得到当前图形上下文
- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //[self drawrectByUIKitWithContext:context];
    
    //[self drawEllipse:context];
    
    //[self drawArc:context];
    [self drawCurve:context];
}

- (void)drawLine1
{
    //1.取得图形上下文对象
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //2.创建路径对象
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, nil, 20,50);//移动到指定位置（设置路径起点）
    CGPathAddLineToPoint(path, nil, 20, 100);//绘制直线（从起点位置开始）
    CGPathAddLineToPoint(path, nil, 300, 100);//绘制另外一条直线（从上一直线终点开始）
    
    //3.添加路径到上下文
    CGContextAddPath(context, path);
    
    //4.设置图形上下文状态属性
    CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1);//设置笔触颜色
    CGContextSetRGBFillColor(context, 0, 1.0, 0, 1);//设置填充色
    CGContextSetLineWidth(context, 2.0);//设置线条宽度
    CGContextSetLineCap(context, kCGLineCapRound);//设置顶点样式，（20，50）和（300，100）是顶点
    CGContextSetLineJoin(context, kCGLineJoinRound);//设置连接点样式,(20,100)是连接点
    
    /*设置线段样式
     phase:虚线开始的位置
     lengths:虚线长度间隔（例如下面的定义说明第一条线段长度8，然后间隔3重新绘制8点的长度线段，当然这个数组可以定义更多元素
     count:虚线数组元素个数
     */
    
    CGFloat lengths[2] = {18,9};
    CGContextSetLineDash(context, 0, lengths, 2);
    
    /*设置阴影
     context:图形上下文
     offset:偏移量
     blur:模糊度
     color:阴影颜色
     */
    
    CGColorRef color = [UIColor grayColor].CGColor;//颜色转化 由于Quartz 2D跨平台，所以其中不能使用UIKit的对象,但UIKit提供了转换方法
    CGContextSetShadowWithColor(context, CGSizeMake(2, 2), 0.8, color);
    
    //5.绘制图像到指定图像上下文
    /* CGPathDrawingMode是填充方式,枚举类型
     enum CGPathDrawingMode {
     kCGPathFill,            只有填充（非零缠绕数填充）,不绘制边框
     kCGPathEOFill,          奇偶规则填充（多条路径交叉时，奇数交叉填充，偶数交叉不填充）
     kCGPathStroke,          只有边框
     kCGPathFillStroke,      既有边框又有填充
     kCGPathEOFillStroke     奇偶填充并绘制边框
     };
     */
    
    CGContextDrawPath(context, kCGPathFillStroke);
    
    //6.释放对象
    CGPathRelease(path);

}

/**
 *  简化绘图方式
 */
- (void)drawLine2
{
    //1.获得图形上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //2.绘制路径（相当于前面创建路径到图形上下文两步操作）
    CGContextMoveToPoint(context, 20, 50);
    CGContextAddLineToPoint(context, 20, 100);
    CGContextAddLineToPoint(context, 300, 100);
    
    //封闭路径：a.创建一条起点和终点的线，不推荐
    //CGPathAddLineToPoint(path,nil,20,50)
    //封闭路径：b.直接调用路径封闭方法
    CGContextClosePath(context);
    
    //3.设置图形上下文属性
    [[UIColor redColor] setStroke]; //设置红色边框
    [[UIColor greenColor] setFill]; //设置绿色填充
    //[[UIColor blueColor] set];      //同时设置填充和边框色
    
    //4.绘制路径
    CGContextDrawPath(context, kCGPathFillStroke);
}

#pragma mark - 绘制矩形

- (void)drawRectWithContext:(CGContextRef)context{
    //添加矩形对象
    CGRect rect = CGRectMake(20, 50, 280.0, 50.0);
    CGContextAddRect(context, rect);
    //设置属性
    [[UIColor blueColor] set];
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);
}

#pragma mark - 绘制矩形（利用UIKit的封装方法）
- (void)drawrectByUIKitWithContext:(CGContextRef)context
{
    CGRect rect = CGRectMake(20, 150, 280.0, 50.0);
    CGRect rect2 = CGRectMake(20, 250, 280.0, 50.0);
    //设置属性
    [[UIColor yellowColor] set];
    
    //绘制矩形，相当于创建对象、添加对象到上下文、绘制三个步骤
    UIRectFill(rect);
    
    [[UIColor redColor] setStroke];
    
    UIRectFrame(rect2);//设置矩形（只有边框）
}

#pragma mark - 绘制椭圆
- (void)drawEllipse:(CGContextRef)context
{
    //添加对象，绘制椭圆(圆形)的过程也是先创建一个矩形
    CGRect rect = CGRectMake(50, 50, 220.0, 200.0);
    CGContextAddEllipseInRect(context, rect);
    
    //设置属性
    [[UIColor purpleColor] set];
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);
}


#pragma mark - 绘制弧形
- (void)drawArc:(CGContextRef)context
{
    /*添加弧形对象
     x:中心点x坐标
     y:中心点y坐标
     radius:半径
     startAngle:起始幅度
     endAngle:终止弧度
     closewise:是否逆时针绘制，0则顺时针绘制
     */
    CGContextAddArc(context, 160, 160, 100.0, 0.0, M_PI_2, 1);
    
    //设置属性
    [[UIColor greenColor] set];
    
    //绘制
    CGContextDrawPath(context, kCGPathFillStroke);
    
}

#pragma mark - 绘制贝塞尔曲线
- (void)drawCurve:(CGContextRef)context{
    //绘制曲线
    
    CGContextMoveToPoint(context, 20, 100);
    /*绘制二次贝塞尔曲线
     c:图形上下文
     cpx:控制点x坐标
     cpy:控制点y坐标
     x:结束点x坐标
     y:结束点y坐标
     */
    CGContextAddQuadCurveToPoint(context, 160, 0, 300, 100);
    
    CGContextMoveToPoint(context, 20, 500);
    /*绘制三次贝塞尔曲线
     c:图形上下文
     cp1x:第一个控制点x坐标
     cp1y:第一个控制点y坐标
     cp2x:第二个控制点x坐标
     cp2y:第二个控制点y坐标
     x:结束点x坐标
     y:结束点y坐标
     */
    CGContextAddCurveToPoint(context, 80, 300, 240, 500, 300, 300);
    
    //设置图形上下文属性
    [[UIColor orangeColor] setStroke];
    [[UIColor yellowColor] setFill];
    
    //绘制路径
    CGContextDrawPath(context, kCGPathFillStroke);
}














@end
